package cn.itsource.system.controller;

import cn.hutool.http.HttpUtil;
import cn.itsource.base.util.AjaxResult;
import cn.itsource.system.domain.User;
import cn.itsource.system.domain.Wxuser;
import cn.itsource.system.domain.dto.LoginDto;
import cn.itsource.system.mapper.UserMapper;
import cn.itsource.system.mapper.WxuserMapper;
import cn.itsource.system.service.ILogininfoService;
import com.alibaba.fastjson2.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * 三方登录接口
 */
@RestController
public class TripartiteLoginController {
    @Value("${wechat.APPID}")
    private String APPID;
    @Value("${wechat.SECRET}")
    private String SECRET;
    @Autowired
    private WxuserMapper wxuserMapper;
    @Autowired
    private ILogininfoService logininfoService;
    @Autowired
    private UserMapper userMapper;
    private static final String wechatPath="https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";
    private static final String wechatUserInfo="https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s";
    @GetMapping("/wechat/login/{code}")
    public AjaxResult wechatLogin(@PathVariable("code")String code){
        //获取token
        String url = String.format(wechatPath, APPID, SECRET, code);
        System.out.println(url);
        String json = HttpUtil.get(url);
        JSONObject jsonObject = JSONObject.parseObject(json);//JSONObject == map
        //根据token获取用户信息
        Object access_token = jsonObject.get("access_token");
        Object openid = jsonObject.get("openid");
        String userInfoPath = String.format(wechatUserInfo, access_token.toString(), openid.toString());
        String s = HttpUtil.get(userInfoPath);
        //JSONObject userInfo = JSONObject.parseObject(s);//得到微信用户的信息
        Wxuser userInfo = JSONObject.parseObject(s, Wxuser.class);
        //分析
        //  第一种可能
        //      用户第一次来  我直接保存微信用户信息
        Wxuser wxuser = wxuserMapper.selectByOpenid(userInfo.getOpenid());
        if (wxuser == null){
            wxuserMapper.save(userInfo);
            return AjaxResult.me().setResultObj(userInfo.getOpenid()).setMessage("noBind").setSuccess(false);
        }
        //      返回一个code回去告诉前端他是第一次  --- 让前端跳转绑定界面  -- 在登录
        //  第二种可能
        //      用户第二次来  没有绑定   自己系统的用户信息
        //      返回一个code回去告诉前端他是第一次  --- 让前端跳转绑定界面  -- 在登录
        if(wxuser.getUserId() == null){
            return AjaxResult.me().setResultObj(wxuser.getOpenid()).setMessage("noBind").setSuccess(false);
        }
        //  第三种可能
        //      用户第二次来  绑定了系统用户信息  --- 直接登录  返回token 和 user
        User user = userMapper.selectById(wxuser.getUserId());
        LoginDto loginDto = new LoginDto();
        loginDto.setType(1);//表示前台用户登录
        loginDto.setUsername(user.getUsername());
        AjaxResult login = logininfoService.login(loginDto, false);//用户token  userinfo
        return login;
    }
}
